//把n个骰子扔在地上，所有骰子朝上一面的点数之和为s。输入n，打印出s的所有可能的值出现的概率。 
//
// 
//
// 你需要用一个浮点数数组返回答案，其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。 
//
// 
//
// 示例 1: 
//
// 输入: 1
//输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]
// 
//
// 示例 2: 
//
// 输入: 2
//输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0
//.05556,0.02778] 
//
// 
//
// 限制： 
//
// 1 <= n <= 11 
// Related Topics 数学 动态规划 概率与统计 👍 282 👎 0


package leetcode.editor.cn1;

//Java：n个骰子的点数

/**
 * 把n个骰子扔在地上，所有骰子朝上一面的点数之和为s。输入n，打印出s的所有可能的值出现的概率。
 * 思路：每个和的次数  / 所有的组合数目 6^n
 * 和的范围:[n, 6n]总共和的范围为 6n - n + 1 = 5n + 1，这么长度
 * 组合的数目 ：6^n
 * 关键是计算每个和的总数，然后 总数 / 6^n
 */
public class NgeTouZiDeDianShuLcof {
    public static void main(String[] args) {
        Solution solution = new NgeTouZiDeDianShuLcof().new Solution();
        // TO TEST
        double[] res = solution.dicesProbability(2);
        for (double re : res) {
            System.out.println(re);
        }
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public double[] dicesProbability(int n) {
            if (n == 0)
                return new double[]{0};
            double total = Math.pow(6, n);
            double[] res = new double[5 * n + 1];
            int[] dp = new int[res.length];
            int nlen = res.length, j = n;

            // 把和作为一个数组
            int[] sums = new int[nlen];
            for (int i = 0; i < nlen; i++) {
                sums[i] = j++;
            }
            for (int i = 0; i < nlen; i++) {
                if (i == 0 || i == nlen - 1) {
                    dp[i] = 1;
                    res[i] = dp[i] / total;
                } else {

                }
            }
            return res;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
